from django.shortcuts import render

# Create your views here.

from rest_framework import viewsets
from rest_framework import mixins
from rest_framework.response import Response
from .models import Absent, AbsentType, AbsentStatusChoices
from .serializers import AbsentSerializer, AbsentTypeSerializer
from rest_framework.views import APIView
from apps.oaauth.serializers import UserSerializer
from .utils import get_responder

# 1. 发起考勤  create
# 2. 处理考勤  update
# 3. 查看自己的考勤列表    list？who=my
# 4. 查看下属的考勤列表    list？who=sub

# 考勤视图
class AbsentViewSet(mixins.CreateModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.ListModelMixin,
                    viewsets.GenericViewSet
                    ):

    queryset = Absent.objects.all() # 指定了默认的查询集，即所有的 Absent 对象。这意味着 AbsentViewSet 视图集将能够处理所有的 Absent 实例。
    serializer_class = AbsentSerializer # 指定了默认的序列化器类，即 AbsentSerializer。这个序列化器类将用于序列化和反序列化 Absent 模型实例。

    def update(self, request, *args, **kwargs):
        # 默认情况下，如果要修改某一条数据，那么要把这个数据的序列化中指定的字段都上传
        # 如果想只修改一部分数据，那么可以在kwargs中设置partial为True
        kwargs['partial'] = True # 这里通过设置 kwargs['partial'] = True，允许客户端进行部分更新，即只需要提供要更新的字段，而不必提交所有字段。
        return super().update(request, *args, **kwargs)

    def list(self,request, *args, **kwargs):
        """ 它支持分页，并且根据请求参数 who 来过滤输出。 """
        queryset = self.get_queryset()
        who = request.query_params.get('who')
        if who and who == 'sub':
            result = queryset.filter(responder=request.user)
        else:
            result = queryset.filter(requester=request.user)

        # result: 代表符合要求的数据
        # pageinage_queryset方法： 会做分页的逻辑处理
        page = self.paginate_queryset(result)
        """  paginate_queryset 和 get_paginated_response：
        这样可以对查询结果进行分页处理，并返回分页信息，如总数据量、当前页数据、上一页/下一页链接等。
        如果查询结果不需要分页（如数据量小于每页显示数），则直接序列化所有符合要求的数据。 """
        if page is not None:
            serializer = self.get_serializer(page,many=True)
            #get_paginated_responde : 出了返回序列化后的数据外，还会返回总数据多少，上一页url是什么
            return self.get_paginated_response(serializer.data)

        serializer = self.serializer_class(result, many=True)
        return Response(data=serializer.data)

# 1. 请假类型
class AbsentTypeView(APIView):
    def get(self, request):
        types = AbsentType.objects.all() # 创建了一个 AbsentType 对象的查询集，包含了数据库中所有的 AbsentType 对象。
        serializer = AbsentTypeSerializer(types, many=True) # 创建了一个序列化器对象 AbsentTypeSerializer，并且使用 types 查询集中的所有对象进行初始化。因为有多个 AbsentType 对象，所以设置 many=True。
        return Response(data=serializer.data)  # Response 对象包含了序列化后的数据，这些数据来自于 serializer.data。data 属性包含了序列化后的对象列表，作为 JSON 格式数据返回给客户端。

# 2. 显示审批者
class ResponderView(APIView):
    def get(self, request):
        responder = get_responder(request)
        # Serializer：如果序列化的对象是一个None，那么不会报错，而是返回一个包含除了主键外的所有字段的空字典
        serializer = UserSerializer(responder) # 这里，responder对象被传递给UserSerializer，意味着序列化器将responder对象序列化为JSON或其他格式的数据，以便在HTTP响应中返回给客户端。
        return Response(data=serializer.data)

